package com.ol.edu.client.controller.upload;


import com.ol.edu.client.entity.ResponseDTO;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.UUID;

/**
 * @author Roger
 * @date 2020/10/8 20:51
 * @description
 */
@RestController
public class UploadController {

    private static TrackerClient trackerClient;
    private static TrackerServer trackerServer;
    private static StorageServer storageServer;
    private static StorageClient1 client;

    static {
        // 加载配置文件
        try {
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            // 创建tracker客户端
            trackerClient = new TrackerClient();
            // 通过tracker客户端获取tracker的连接服务并返回
            trackerServer = trackerClient.getConnection();
            // 声明storage服务
            storageServer = null;
            // 定义storage客户端
            client = new StorageClient1(trackerServer, storageServer);
            // 判断文件夹是否存在，不存在则创建
            File parentFile = new File("C:/video/");
            if (!parentFile.exists()) {
                parentFile.mkdirs();
                System.out.println("创建目录：" + parentFile);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 上传图片到文件服务器
     *
     * @param file
     * @return 返回访问图片的url地址
     */
    @PostMapping("/upload")
    public ResponseDTO fileUpload(@RequestParam("file") MultipartFile file) {
        String fileId = null;
        try {
            /* 1、把文件保存到web服务器*/
            // 从文件对象中获取 文件的原始名称
            String oldFileName = file.getOriginalFilename();
            // 通过字符串截取的方式，从文件原始名中获取文件的后缀   1.jpg
            String hou = oldFileName.substring(oldFileName.lastIndexOf(".") + 1);
            // 为了避免文件因为同名而覆盖，生成全新的文件名
            String newFileName = UUID.randomUUID().toString() + "." + hou;
            // 创建web服务器保存文件的目录(预先创建好D:/upload目录，否则系统找不到路径，会抛异常)
            File toSaveFile = new File("C:/video/", newFileName);
            // 将路径转换成文件
            file.transferTo(toSaveFile);
            // 获取服务器的绝对路径
            String newFilePath = toSaveFile.getAbsolutePath();

            /* 2、把文件从web服务器上传到FastDFS*/
            // 定义文件元信息
            NameValuePair[] list = new NameValuePair[1];
            list[0] = new NameValuePair("fileName", oldFileName);
            // 上传
            fileId = client.upload_file1(newFilePath, hou, list);
            System.out.println("fileId = " + fileId);
//            trackerServer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        HashMap<String, String> map = new HashMap<>(1);
        map.put("filePath","http://192.168.64.132/" + fileId);
        //通过nginx反向代理提供访问图片的路径
        return new ResponseDTO(true, 200, "上传成功", map);
    }

}
